#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include <string.h>
#include <list>
using namespace std;

//设计一个类Note（提醒），包含时间和事件内容，时间由年月日时分秒组成，事件内容用字符串表示。
//类的编码大致如下：
//class Note
//{
//    int year, month, day, hour, minute, second;
//    char* event;  //本题要求event必须为一个字符串指针，不能为字符数组或string字符串
//    //以下只说明了两个构造函数，可根据需要自己增加构造函数的重载
//    Note(char* msg, int year, int month, int day, int hour = 0, int minute = 0, int second = 0);
//    Note(const Note& note);
//    ~Note();
//    //还需要重载等于号，还可根据需要设计ShowNote()方法，用来显示“提醒”的时间和内容
//}

class Note
{
public:
    Note(const char* msg = "", int year = 0, int month = 0, int day = 0
        , int hour = 0, int minute = 0, int second = 0);
    Note(const Note& note);
    const Note& operator=(Note note);
    bool operator<(const Note& nt) const;
    bool operator==(const Note& nt) const;
    bool operator<=(const Note& nt) const;
    void ShowNote() const;
    ~Note();
private:
    int _year;
    int _month;
    int _day;

    int _hour;
    int _minute;
    int _second;

    char* _event = nullptr;
};

Note::Note(const char* msg, int year, int month, int day
    , int hour, int minute, int second)
    :_event(new char[strlen(msg) + 1])
    , _year(year)
    , _month(month)
    , _day(day)
    , _hour(hour)
    , _minute(minute)
    , _second(second)
{
    strcpy(_event, msg);
}

Note::Note(const Note& note)
    :_event(new char[strlen(note._event) + 1])
    , _year(note._year)
    , _month(note._month)
    , _day(note._day)
    , _hour(note._hour)
    , _minute(note._minute)
    , _second(note._second)
{
    strcpy(_event, note._event);
}

const Note& Note::operator=(Note note)
{
    swap(*this, note);
    return *this;
}

bool Note::operator<(const Note& nt) const
{
    if (_year < nt._year) return true;
    else if (_year == nt._year && _month < nt._month) return true;
    else if (_year == nt._year && _month == nt._month && _day < nt._day) return true;
    else if (_year == nt._year && _month == nt._month && _day == nt._day && _hour < nt._hour) return true;
    else if (_year == nt._year && _month == nt._month && _day == nt._day && _hour == nt._hour && _minute < nt._minute) return true;
    else if (_year == nt._year && _month == nt._month && _day == nt._day && _hour == nt._hour && _minute == nt._minute && _second < nt._second) return true;
    return false;
}
bool Note::operator==(const Note& nt) const
{
    return _year == nt._year && _month == nt._month && _day == nt._day
        && _hour == nt._hour && _minute == nt._minute && _second == nt._second;
}
bool Note::operator<=(const Note& nt) const
{
    return (*this) < nt || (*this == nt);
}

void Note::ShowNote() const
{
    printf("%d-%02d-%02d %02d:%02d:%02d %s\n", _year, _month, _day, _hour, _minute, _second, _event);
}

Note::~Note()
{
    delete[] _event;
    _event = nullptr;
}

// 再设计一个提醒列表类：NoteList，
// 私有数据成员包含一个Note数组
//（如果可能，最好使用vector代替数组）
// 还有以下成员函数：
// 插入提醒信息
//（插入后保持按时间升序排序，如果两个提醒信息时间完全相同，则后插入的排在后）
// 删除数组中第0个提醒信息并作为函数值返回
//（因为是按时间排序，所以第0个肯定是时间最早的一个）
// 输出所有提醒信息
// 获得提醒信息的数量
// NoteList的成员大致为：
// 数据成员：
// 一个Note数组：noteArr
// 一个int成员：noteCount
// 函数成员：
// 构造函数
// AddNote(Note n)：插入提醒信息
//（插入后保持按时间升序排序）
// Note DeleteFirst() : 删除数组中第0个提醒信息，并将其作为函数值返回
// PrintAll()：输出所有提醒信息
// GetNoteCount()：获得提醒信息的数量
// 可根据自己需要再增加其它成员。

class NoteList
{
public:
    void AddNote(const Note& nt);
    int GetNoteCount() const { return _noteCount; }
    Note DeleteFirst();
    void PrintAll() const;
private:
    list<Note> _noteArr;
    int _noteCount = 0;
};

void NoteList::AddNote(const Note& nt)
{
    auto it = _noteArr.begin();
    while (it != _noteArr.end() && (*it) <= nt) it++;
    _noteArr.insert(it, nt);
    _noteCount++;
}

Note NoteList::DeleteFirst()
{
    Note tmp(_noteArr.front());
    _noteArr.pop_front();
    _noteCount--;
    return tmp;
}

void NoteList::PrintAll() const
{
    for (auto& e : _noteArr) e.ShowNote();
}

// main函数参考如下代码：

int main()
{
    char eventMsg[100];
    Note n2;
    int year, month, day, hour, minute, second;
    int i, n;
    NoteList notes;
    int op;
    while (cin >> op)
    {
        switch (op)
        {
        case 1:
        {
            cin >> year;
            cin >> month;
            cin >> day;
            cin >> hour;
            cin >> minute;
            cin >> second;
            cin.get();
            cin.getline(eventMsg, 90);
            Note nt(eventMsg, year, month, day, hour, minute, second);
            notes.AddNote(nt);
            break;
        }
        case 2:
        {
            if (notes.GetNoteCount() > 0)
            {
                Note nt = notes.DeleteFirst();
                nt.ShowNote();
            }
            break;
        }
        case 3:
        {
            int cnt = notes.GetNoteCount();
            cout << cnt << " notes:" << endl;
            notes.PrintAll();
            break;
        }
        }
    }
    return 0;
}
